#ifndef PARSER_H
#define PARSER_H

#include "lexer.h"
#include "ast.h"
#include <vector>
#include <memory>

class Parser {
private:
    std::vector<Token> tokens;
    size_t current;
    
    Token currentToken();
    Token peekToken();
    void advance();
    bool match(TokenType type);
    bool isAtEnd();
    
    // Expression parsing
    std::unique_ptr<Expression> parseExpression();
    std::unique_ptr<Expression> parseAssignment();
    std::unique_ptr<Expression> parseEquality();
    std::unique_ptr<Expression> parseComparison();
    std::unique_ptr<Expression> parseTerm();
    std::unique_ptr<Expression> parseFactor();
    std::unique_ptr<Expression> parseUnary();
    std::unique_ptr<Expression> parsePrimary();
    
    // Statement parsing
    std::unique_ptr<Statement> parseStatement();
    std::unique_ptr<Statement> parseExpressionStatement();
    std::unique_ptr<Statement> parseReturnStatement();
    std::unique_ptr<Statement> parseIfStatement();
    std::unique_ptr<Statement> parseWhileStatement();
    std::unique_ptr<Statement> parseBlockStatement();
    
    // Declaration parsing
    std::unique_ptr<Declaration> parseDeclaration();
    std::unique_ptr<Declaration> parseVariableDeclaration();
    std::unique_ptr<Declaration> parseFunctionDeclaration();
    
    // Utility functions
    TokenType parseType();
    void synchronize();
    
public:
    Parser(const std::vector<Token>& tokens);
    std::unique_ptr<Program> parse();
};

#endif
